//ES5的语法

var name = 'lijing'
var age = 100
//undedined
// console.log(num1)
// console.log(window);

foo()

function foo() {
  // console.log('foo===',name);
  var name = 'ki'
  var num = 10_000
  
  // console.log(name,num)
  function bar() {
    // age= 10
    console.log(age);
  }
  
  bar()
  console.log(this)
}

var num1 = 20
var num2 = 30
var result = num1 + num2
// console.log(result)


/*
1. js引擎在执行代码之前，会在堆内存中创建一个全局对象：GlobalObject（GO）
  - 该对象所有的作用域（scope）都可以访问
  - 里面包含Date、Array、String、Number、setTimeout、setInterval等
  - 其中还有一个window属性指向自己
  其实这就是编译阶段
  var GlobalObject = {
    Date,
    Array,
    String,
    Number,
    ...
    window: this/就是GlobalObject自身
    //普通变量就是undefined
    name: undefined,
    num1: undefined,
    num2: undefined,
    result: undefined
    //函数比较特殊，函数编译阶段会在堆内存中开辟一个空间来存储foo函数，主要包括
      ①父级作用域 [[scope]]: parent scope
      ②函数执行体
    foo: 0xa00(指向内存中的存储空间,引用)
  }

2. 运行代码
  2.1 V8引擎为了运行代码，内部会有一个执行上下文栈ECS(Execution Context Stack),函数调用栈
  2.2 因为我们执行的全局代码，为了全局代码能够正常执行，需要创建全局上下文GEC(Global Execution Context)，全局代码需要被执行时才创建
      GEC被放到ECS中里面包含两部分内容：
      - ①在代码执行之前，在parser转换成AST的过程中，会将全局定义的变量、函数等加入到GlobalObject中，但是并不会赋值，这个过程也称为变量作用域提升(hoisting
      )
        var GlobalObject = {
            ...
            name: undefined,
            num1: undefined,
            num2: undefined,
            result: undefined
        }
      - ②在代码执行中，对变量赋值，或其他的函数
        var GlobalObject = {
            ...
            name: 'lijing',
            num1: 20,
            num2: 30,
            result: 50
        }
   2.3 函数执行
      创建函数执行上下文FEC(Function Execution Context),并压入到ECS中
      FEC中包含三部分内容：
       ①在解析函数成为AST树结构时，会创建一个ActivationObject(AO)，其中包括形参、args、函数定义和指向函数对象、定义的变量
       ②作用域链，由VO(在函数中就是AO)和父级VO组成，查找时会一层一层找
       ③this绑定的值

*/

